/**
 * @Title:   [EnumToMapInterceptor.java]
 * @Package: [com.yixun.qfbao.interceptor]
 * @author:  [shaoping.jiao] 
 * @CreateDate: [2017年11月16日 下午3:53:57]   
 * @UpdateUser: [shaoping.jiao]   
 * @UpdateDate: [2017年11月16日 下午3:53:57]   
 * @Description:  [枚举类拦截器]
 * @version: [V1.0]
 */
package com.yixun.qfbao.interceptor;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import com.yixun.qfbao.constants.ApiConstant;
import com.yixun.qfbao.util.EnumsUtil;

/**
 * @ClassName: EnumToMapInterceptor
 * @author: [shaoping.jiao]
 * @CreateDate: [2017年11月16日 下午3:53:57]
 * @UpdateUser: [shaoping.jiao]
 * @UpdateDate: [2017年11月16日 下午3:53:57]
 * @Description: [枚举类拦截器]
 * @version: [V1.0]
 */
@Component
@Aspect
public class EnumToListInterceptor {
	
	// 第一个*号：表示返回类型，*号表示所有的类型
	// 包名：表示需要拦截的包名，后面的两个句点表示当前包和当前包的所有子包
	// 第二个*号：表示类名，*号表示所有的类
	// *(..):最后这个星号表示方法名，*号表示所有的方法，后面括弧里面表示方法的参数，两个句点表示任何参数。
	@Pointcut("execution(* com.yixun.qfbao.controller..*.*(..))  && @annotation(com.yixun.qfbao.annotations.EnumToList)")
	public void enumToList() {
	
	}
	
	// 环绕通知
	@Around("enumToList() && args(request,key)")
	public Object updateDomain(ProceedingJoinPoint pjp, HttpServletRequest request, String key)
		throws Throwable {
		Object[] args = pjp.getArgs();
		List<Map<String, Object>> returnList = new ArrayList<>();
		Class<?> c;
		try {
			c = Class.forName(ApiConstant.XFENUMS + key);
			returnList = EnumsUtil.EnumToList(c);
		} catch (ClassNotFoundException e) {
			try {
				c = Class.forName(ApiConstant.MODELENUMS + key);
				returnList = EnumsUtil.EnumToList(c);
			} catch (ClassNotFoundException ce) {
				Map<String, Object> returnMap = new HashMap<>();
				returnMap.put("-1", "未找到对应的枚举类");
				returnList.add(returnMap);
			}
		}
		request.setAttribute(ApiConstant.ENUMMAP, returnList);
		args[0] = request;
		return pjp.proceed(args);
	}
}
